CスタイルのマクロからC++の型安全なリテラルへの移行は、言語の使いやすさにおいて根本的な変化をもたらし、 「NULLの罠」 ゼロマクロの曖昧さが静かに論理エラーを引き起こすという問題を解決する。
1. オーバーロード解像度の失敗
レガシースタンダード(C++98)では、 NULL はしばしば 0として定義される。オーバーロードされた関数に渡された場合、コンパイラは NULL を整数として解釈する。これは次のコードで確認できる。
if (std::is_same<decltype(NULL), decltype(0)>::value)
std::cout << "NULLは整数です";
std::cout << "NULLは整数です";
2. nullptrの解決策
C++11では nullptrというキーワードが導入され、その型は std::nullptr_tである。マクロとは異なり、整数型(ブール型を除く)に暗黙的に変換できないため、ポインタ専用のオーバーロードが正しく選ばれる。
3. リンクおよび相互運用性
現代のC++では extern "C" を用いて、Cコード(例: gccでコンパイルされたもの)とのリンク時に名前マングリングを防ぐ必要がある。この境界での型安全なポインタの維持は非常に重要である。
$$\text{std::nullptr\_t} \neq \text{int}$$
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>